Support GPX <sym>/pushpin icon number
authorjames_sherring <james_sherring@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 6 Dec 2003 12:39:05 +0000 (12:39 +0000)
committerjames_sherring <james_sherring@f51c46e8-681c-474f-0cfe-069cfd0219fb>
Sat, 6 Dec 2003 12:39:05 +0000 (12:39 +0000)
12 files changed:
st2gpx/src/ToDo.txt
st2gpx/src/debug.c
st2gpx/src/gpx.h
st2gpx/src/history.txt
st2gpx/src/ppinutil.c
st2gpx/src/ppinutil.h
st2gpx/src/pushpins.cpp
st2gpx/src/readgpx.c
st2gpx/src/st2gpx.c
st2gpx/src/st2gpx.dsp
st2gpx/src/st2gpx.h
st2gpx/src/writegpx.c

index 5405585c3fb22f11365d60ba1a95487aff3dfa71..c3ab5e37b6d5993cda081c2eb612a813df83dc26 100644 (file)
@@ -27,3 +27,4 @@ Still to test:
 * import to file with existing data\r
 * import to empty file\r
 * meaning of options etc for v4 files\r
+\r
index 675338d0b3a4c93536c57411752d0e0ecbea3511..62a11a5bed80511e88b43a56ab9ef438ddac753d 100644 (file)
@@ -53,13 +53,14 @@ void debug_pause()
 void printbuf(char* buf, int len)\r
 {\r
        int i;\r
+       unsigned char * ubuf = (unsigned char *)buf;\r
        printf("     0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F\n");\r
        printf("    -----------------------------------------------");\r
        for(i=0; i<len; i++)\r
        {\r
                if (((i+1) & 0x0f) == 0x1)\r
                        printf("\n%2x| ",i/16);\r
-               printf("%2x ", (unsigned char)buf[i]);\r
+               printf("%2x ", ubuf[i]);\r
        }\r
        printf("\n\n");\r
 }\r
index 107ddb6d203543f637df2d12e0ac847a4df87c3b..a55173cb30c4cd7b47bf69d3bb857509d18e20d3 100644 (file)
@@ -47,6 +47,12 @@ typedef struct gpxpt
        char use_elevation;\r
        char * name;\r
        char * desc;\r
+       // This is the MS Map symbol.\r
+       // FIXME Actually, MS Map symbol varies between versions, \r
+       // so this should be an invariant id. \r
+       int symbol;\r
+       char* url;\r
+       char* urlname;\r
        // more later\r
 } tag_gpxpt;\r
 \r
index d5e0eb6bfbff9a91cd8e1b5495a85b586e357df0..5e6d20a0444e203aa46a9909d620a56d9dcdde1c 100644 (file)
@@ -21,7 +21,8 @@ Yeah, ok, I am just an amateur at this...
                        integrate parts into single C/C++ exe (except istorage)\r
  9-11-2003  fixed invalid gpx.\r
 10-11-2003  gpx import working for routes/tracks to s&t annotation lines.\r
-13-11-2003  export as pcx5 for import into Garmin MapSource\r
+13-11-2003  export as pcx5 for import into Garmin MapSource, \r
+                       import from Garmin MapSource text export format\r
 20-11-2003     substantial cleanup\r
                        fixed 8byte alignment in properties.c\r
                        introduced 1byte alignment for journey analysis\r
@@ -29,3 +30,4 @@ Yeah, ok, I am just an amateur at this...
 22-11-2003  explores UDM data\r
 28-11-2003     imports pushpins\r
                        imports lines to v3 annotations (2002+)\r
+ 5-12-2003  imports/exports symbols, with custom GPX symbol names\r
index 8f27e304037ca2faf2cd6614593a9bd0fd6a31cd..bd5ad6b425ae7edffc4fa46f8cc1d19ddf908fc0 100644 (file)
@@ -79,6 +79,10 @@ struct pushpin * pushpin_new()
        nw->NoteShort=NULL;\r
        nw->UdName=NULL;\r
        strcpy(nw->garmin_ident, "      ");\r
+       nw->RenderData=0;\r
+       nw->RenderData2=0;\r
+       nw->url=NULL;\r
+       nw->urlname=NULL;\r
        return nw;\r
 }\r
 \r
@@ -88,6 +92,8 @@ void pushpin_delete(struct pushpin * pp)
                return;\r
        free(pp->NoteShort);\r
        free(pp->UdName);\r
+       free(pp->url);\r
+       free(pp->urlname);\r
        free(pp);\r
 }\r
 \r
@@ -288,3 +294,82 @@ struct pushpin_safelist * process_pushpin_file(char* ppin_in_file_name)
 \r
        return ppplist;\r
 }\r
+\r
+char std_udm1[6] = {18, 0, 0, 0, 0, 0};\r
+char std_udm2[1] = {1};\r
+\r
+void explore_udm_data(struct pushpin_safelist * ppl)\r
+{\r
+       int i;\r
+       struct f_udm0_header * udm0_head=NULL;\r
+       struct f_udm0_header1 * udm0_head1=NULL;\r
+       struct f_udm0_ppin * udm0_ppin=NULL;\r
+       int expected_udm2_len=0;\r
+\r
+       printf("Exploring UDM_Data from UserData\n");\r
+\r
+       // check UDM_Data[1]\r
+       if(ppl->UDM_Data_length[1] != 6)\r
+               printf("Unexpcted UDM_Data[1] length = %d, expected length 6\n", \r
+                               ppl->UDM_Data_length[1]);\r
+       else\r
+               for(i=0; i<6; i++)\r
+                       if(ppl->UDM_Data[1][i] != std_udm1[i])\r
+                               printf("UDM_Data[1][%d]=%#x, normally expect value %#x\n", \r
+                                               i,\r
+                                               (unsigned char)(ppl->UDM_Data[1][i]), \r
+                                               (unsigned char)(std_udm1[i]));\r
+                                        \r
+       // check UDM_Data[2]\r
+       if(ppl->UDM_Data_length[2] != 1)\r
+               printf("Unexpcted UDM_Data[2] length = %d, expected length 1\n", \r
+                               ppl->UDM_Data_length[2]);\r
+       else\r
+               if(ppl->UDM_Data[2][0] != std_udm2[0])\r
+                               printf("UDM_Data[2][0]=%#x, normally expect value %#x\n", \r
+                                               (unsigned char)ppl->UDM_Data[2][0], \r
+                                               (unsigned char)(std_udm2[0]));\r
+\r
+       // check UDM_Data[0]\r
+       \r
+       if (ppl->UDM_Data_length[0] < 14)\r
+       {\r
+               printf("UDM_Data[0] is too small to have a valid header\n");\r
+               return;\r
+       }\r
+\r
+       udm0_head = (struct f_udm0_header *)(ppl->UDM_Data[0]);\r
+       printf("There are %d highlighted pushpins\n", udm0_head->c_highlight_recs);\r
+       // list the highlighted udids? Nah.\r
+\r
+       if(udm0_head->sunkn != 0x8001)\r
+       {\r
+               printf("Unexpected f_udm0_header:\n");\r
+               printbuf(ppl->UDM_Data[0], sizeof(struct f_udm0_header));\r
+       }\r
+\r
+       udm0_head1 = (struct f_udm0_header1*)\r
+                                       (ppl->UDM_Data[0] + sizeof(struct f_udm0_header) \r
+                                        + 4*(udm0_head->c_highlight_recs));\r
+               \r
+       if( udm0_head1->iunkn != 0)\r
+               printf("Unexpected f_udm0_header1->iunkn=%#x:\n",udm0_head1->iunkn);\r
+\r
+       expected_udm2_len = (14 + 4*(udm0_head->c_highlight_recs) \r
+                                                       + 6*(udm0_head1->c_format_records));\r
+       if(ppl->UDM_Data_length[0] != expected_udm2_len)\r
+               printf("Unexpcted UDM_Data[0] length = %d, expected length %d for %d indicated format_records\n", \r
+                               ppl->UDM_Data_length[0], expected_udm2_len, udm0_head1->c_format_records);\r
+       else\r
+       {\r
+               udm0_ppin = (struct f_udm0_ppin *)(ppl->UDM_Data[0] + 14 + 4*(udm0_head->c_highlight_recs) );\r
+               // size has already been verified as (14 + 6 * udm0_head->c_format_records)\r
+               for(i=0; i<(udm0_head1->c_format_records); i++)\r
+                       printf("udm0 ppin_rec[%d] has udid=%d, format=%#x, zorder=%d\n",\r
+                                       i, \r
+                                       udm0_ppin[i].ppin_udid, \r
+                                       udm0_ppin[i].format, \r
+                                       udm0_ppin[i].zorder);\r
+       }\r
+\r
+}
\ No newline at end of file
index cade80e3c5aa2376b18d3d716ea6e305edb2f24c..9a648307137e74be9d10e59bc2c06ae3dc208838 100644 (file)
 extern "C" {\r
 #endif\r
 \r
+// The structures in UserData/UDM_Data for UDMId=0\r
+typedef struct f_udm0_header\r
+{\r
+       unsigned short int sunkn; // normally 0x8001\r
+       int c_highlight_recs; \r
+} tag_f_udm0_header;\r
+// then c_highlight_recs ints with udid of highlighted ppin\r
+typedef struct f_udm0_header1\r
+{\r
+       int iunkn; // normally 0, probably indicates some array length to mess everything up\r
+       int c_format_records;\r
+} tag_f_udm0_header1;\r
+// then c_format_records of these:\r
+typedef struct f_udm0_ppin\r
+{\r
+       int ppin_udid;\r
+       // 1 = show name + info\r
+       // (no record if name not shown?)\r
+       // 3 = show name\r
+       // 4 = upper left\r
+       // 8 = upper right\r
+       // 12 = lower left\r
+       // 16 = lower right\r
+       unsigned char format;   \r
+       unsigned char zorder;\r
+} tag_f_udm0_ppin;\r
+\r
 typedef struct pushpin_safelist\r
 {\r
        struct pushpin ** pushpin_list;\r
@@ -55,9 +82,15 @@ typedef struct pushpin
        int SetId;\r
        long Grid;\r
        long Precision;\r
+       int RenderData;\r
+       // only in mappoint?\r
+       int RenderData2;\r
 //     dword RenderData;\r
-//     byte MatchId;\r
-//     long MOBBId;\r
+       // 1 = by hand\r
+       // 2 = from file?\r
+       // 4 = not matched?\r
+       short int MatchId;\r
+       long MOBBId;\r
 //     long SourceUdId;\r
 //     bool IsTerritory;\r
 //\r
@@ -75,12 +108,9 @@ typedef struct pushpin
 // shouldn't include these 3 here because they are not part of the native pushpin definition\r
        double lat;\r
        double lon;\r
-       // 1 = by hand\r
-       // 2 = from file?\r
-       // 4 = not matched?\r
-       short int MatchId;\r
-       long MOBBId;\r
        char garmin_ident[7];\r
+       char* url;\r
+       char* urlname;\r
 } tag_pushpin;\r
 \r
 \r
@@ -123,6 +153,8 @@ struct pushpin_safelist * process_pushpin_file(char* ppin_in_file_name);
 struct point grid2latlon(long grid, long precision);\r
 struct grid_point latlon2grid(double lat, double lon);\r
 \r
+void explore_udm_data(struct pushpin_safelist * ppl);\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 7bc4f7b30a154ce84371c7e256e8d91e67965a5f..77ff59a621d8553649d83c810f7166a50e76a72a 100644 (file)
@@ -105,7 +105,7 @@ VARIANT val2variant(unsigned short fieldtype, void* stor_var)
        return vt_val;\r
 };\r
 \r
-void variant2val(VARIANT vt_val, unsigned short fieldtype, void* stor_var)\r
+void variant2val(VARIANT vt_val, unsigned short fieldtype, void* stor_var, int expected_buf_length)\r
 {\r
        char* shortstr=NULL;\r
        long lbound;\r
@@ -114,7 +114,8 @@ void variant2val(VARIANT vt_val, unsigned short fieldtype, void* stor_var)
        // should be a short?\r
        char array_val=0;\r
 \r
-       if ((vt_val.vt == fieldtype) || ( (fieldtype==VT_BSTR) && (vt_val.vt==VT_NULL)))\r
+       if ((vt_val.vt == fieldtype) || ( (fieldtype==VT_BSTR) && (vt_val.vt==VT_NULL))\r
+               || ( (fieldtype==(VT_ARRAY | VT_UI1)) && (vt_val.vt==VT_NULL)) )\r
        {\r
                switch (vt_val.vt)\r
                {\r
@@ -134,6 +135,7 @@ void variant2val(VARIANT vt_val, unsigned short fieldtype, void* stor_var)
                        break;\r
 \r
                case VT_NULL:\r
+                       // FIXME should return NULL here and hande the nulls elsewhere\r
                        // expected string, this is null \r
                        // so return empty string\r
                        shortstr = (char*)xmalloc(1);\r
@@ -147,14 +149,23 @@ void variant2val(VARIANT vt_val, unsigned short fieldtype, void* stor_var)
                        {\r
                                printf("got safe array of short ints, with %d dimensions and bounds %d:%d\n", \r
                                        SafeArrayGetDim(vt_val.parray), lbound, ubound);\r
-                               printf("Sadly, I was expecting 1 dimention and lower bound of zero, so I will ignore this array.\n");\r
+                               printf("Sadly, I was expecting 1 dimension and lower bound of zero, so I will ignore this array.\n");\r
                                break;\r
                        }\r
+\r
+                       if (ubound+1 != expected_buf_length)\r
+                       {\r
+                               printf("Error reading VT_ARRAY: expected length %d but array has length %d\n",\r
+                                               expected_buf_length, ubound);\r
+                               //return;\r
+                       }\r
                        for(elmt=lbound; elmt<ubound+1; elmt++)\r
                        {\r
                                SafeArrayGetElement(vt_val.parray, &elmt, &array_val);\r
-                               //printf("array(%d)=%d\n", elmt, array_val);\r
-                               ((char*)stor_var)[elmt-lbound]=array_val;\r
+                               if (ubound+1 == expected_buf_length)\r
+                                       ((char*)stor_var)[elmt-lbound]=array_val;\r
+                               else\r
+                                       printf("array(%d)=%d\n", elmt, array_val);\r
                        }\r
                        //debug_pause();\r
                        break;\r
@@ -180,15 +191,18 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
        struct pushpin_safelist * ppplist = pushpin_safelist_new();\r
        // number of pushpins to allocate pointer-array storage for, this is incremented as needed\r
        int ppin_list_alloc_size=100;\r
+       int val_type=0;\r
        char * ppin_sql = NULL;\r
        char * UDM_sql = NULL;\r
+       char RenderData_buf[4]="";\r
+       int RenderData_len=0;\r
 \r
        ppplist->pushpin_list = (struct pushpin **)xmalloc(ppin_list_alloc_size*sizeof(struct pushpin *));\r
 \r
        if (opts.st_version_num<9)\r
-               ppin_sql = "SELECT UD_Secondary.UdId, UD_Secondary.UdName, UD_Secondary.NoteShort, UD_Secondary.NoteLong, UD_Main.Grid, UD_Main.Precision, UD_Main.MatchId, UD_Main.MOBBId FROM UD_Main INNER JOIN UD_Secondary ON UD_Main.UdId = UD_Secondary.UdId";\r
+               ppin_sql = "SELECT UD_Secondary.UdId, UD_Secondary.UdName, UD_Secondary.NoteShort, UD_Secondary.NoteLong, UD_Main.Grid, UD_Main.Precision, UD_Main.RenderData, UD_Main.MatchId, UD_Main.MOBBId FROM UD_Main INNER JOIN UD_Secondary ON UD_Main.UdId = UD_Secondary.UdId";\r
        else\r
-               ppin_sql = "SELECT UdId, UdName, NoteShort, NoteLong, Grid, Precision, MatchId, MOBBId FROM UD_Main";\r
+               ppin_sql = "SELECT UdId, UdName, NoteShort, NoteLong, Grid, Precision, RenderData, MatchId, MOBBId FROM UD_Main";\r
 \r
        try \r
        {\r
@@ -219,13 +233,44 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
                {\r
                        ppin = pushpin_new();\r
 \r
-                       variant2val(rs->Fields->GetItem("UdId")->Value,         VT_I4,  &(ppin->UdId));\r
-                       variant2val(rs->Fields->GetItem("UdName")->Value,       VT_BSTR,&(ppin->UdName));\r
-                       variant2val(rs->Fields->GetItem("Grid")->Value,         VT_I4,  &(ppin->Grid));\r
-                       variant2val(rs->Fields->GetItem("Precision")->Value,VT_I4,      &(ppin->Precision));\r
-                       variant2val(rs->Fields->GetItem("NoteShort")->Value,VT_BSTR,&(ppin->NoteShort));\r
-                       variant2val(rs->Fields->GetItem("MatchId")->Value,      VT_I2,  &(ppin->MatchId));\r
-                       variant2val(rs->Fields->GetItem("MOBBId")->Value,       VT_I4,  &(ppin->MOBBId));\r
+                       variant2val(rs->Fields->GetItem("UdId")->Value,         VT_I4,  &(ppin->UdId), 0);\r
+                       variant2val(rs->Fields->GetItem("UdName")->Value,       VT_BSTR,&(ppin->UdName), 0);\r
+                       variant2val(rs->Fields->GetItem("Grid")->Value,         VT_I4,  &(ppin->Grid), 0);\r
+                       variant2val(rs->Fields->GetItem("Precision")->Value,VT_I4,      &(ppin->Precision), 0);\r
+                       variant2val(rs->Fields->GetItem("NoteShort")->Value,VT_BSTR,&(ppin->NoteShort), 0);\r
+\r
+                       RenderData_len = rs->Fields->GetItem("RenderData")->ActualSize;\r
+                       val_type = rs->Fields->GetItem("RenderData")->Value.vt;\r
+                       if(val_type!=VT_NULL)\r
+                       {\r
+                               if (RenderData_len==4)\r
+                               {\r
+                                       variant2val(rs->Fields->GetItem("RenderData")->Value,(VT_ARRAY | VT_UI1),  RenderData_buf, RenderData_len);\r
+                                       ppin->RenderData = *(int*)RenderData_buf;\r
+                                       //printf("got pushpin symbol %#x=%d\n", ppin->RenderData, ppin->RenderData);\r
+                               }\r
+                               else if (RenderData_len==8)\r
+                               {\r
+                                       variant2val(rs->Fields->GetItem("RenderData")->Value,(VT_ARRAY | VT_UI1),  RenderData_buf, RenderData_len);\r
+                                       ppin->RenderData = *(int*)RenderData_buf;\r
+                                       //printf("got pushpin symbol %#x=%d\n", ppin->RenderData, ppin->RenderData);\r
+                                       ppin->RenderData2 = *(int*)(RenderData_buf+4);\r
+                                       if(ppin->RenderData2 != 0)\r
+                                       {\r
+                                               printf("got pushpin symbol %#x=%d\n", ppin->RenderData, ppin->RenderData);\r
+                                               printf("Got pushpin symbol part2 %#x=%d\n", ppin->RenderData2, ppin->RenderData2);\r
+                                       }\r
+                               }\r
+                               else\r
+                               {\r
+                                       printf("Unexpected RenderData_len=%d\n", RenderData_len);\r
+                                       variant2val(rs->Fields->GetItem("RenderData")->Value,(VT_ARRAY | VT_UI1),  RenderData_buf, RenderData_len);\r
+                                       printbuf(RenderData_buf, RenderData_len);\r
+                               }\r
+                       }\r
+\r
+                       variant2val(rs->Fields->GetItem("MatchId")->Value,      VT_I2,  &(ppin->MatchId), 0);\r
+                       variant2val(rs->Fields->GetItem("MOBBId")->Value,       VT_I4,  &(ppin->MOBBId), 0);\r
 \r
                        str2ascii(ppin->UdName);\r
                        str2ascii(ppin->NoteShort);\r
@@ -256,12 +301,14 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
                        hr = rs->MoveNext();\r
                }\r
                hr = rs->Close();\r
+               ppplist->num_pushpins=ppinnum;\r
 \r
                // *************\r
                // read UDM_Data\r
                // *************\r
 \r
-               if (opts.explore_flag)\r
+               // always read udm data now\r
+               //if (opts.explore_flag)\r
                {\r
                        UDM_sql = "Select UdmDataId, UdmData from UDM_Data";\r
 \r
@@ -273,7 +320,7 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
 \r
                        while ((rs->adoEOF == FALSE))\r
                        {\r
-                               variant2val(rs->Fields->GetItem("UdmDataId")->Value, VT_I4, &UdmDataId);\r
+                               variant2val(rs->Fields->GetItem("UdmDataId")->Value, VT_I4, &UdmDataId, 0);\r
                                if ( (UdmDataId<0) || (UdmDataId>3) )\r
                                {\r
                                        printf("*** Unexpected UdmDataId=%d\n", UdmDataId);\r
@@ -282,15 +329,23 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
                                \r
                                ppplist->UDM_Data_length[UdmDataId] = rs->Fields->GetItem("UdmData")->ActualSize; \r
                                ppplist->UDM_Data[UdmDataId]=(char*)xmalloc(ppplist->UDM_Data_length[UdmDataId]);\r
-                               variant2val(rs->Fields->GetItem("UdmData")->Value, VT_ARRAY | VT_UI1, ppplist->UDM_Data[UdmDataId]);\r
+                               variant2val(rs->Fields->GetItem("UdmData")->Value, VT_ARRAY | VT_UI1, ppplist->UDM_Data[UdmDataId], ppplist->UDM_Data_length[UdmDataId] );\r
 \r
                                printf("In UDM_Data table, for UdId=%d got %d bytes of data\n",\r
                                        UdmDataId,      ppplist->UDM_Data_length[UdmDataId]);\r
-                               printbuf(ppplist->UDM_Data[UdmDataId], ppplist->UDM_Data_length[UdmDataId]);\r
+                               \r
+                               if (opts.explore_flag)\r
+                               {\r
+                                       printbuf(ppplist->UDM_Data[UdmDataId], ppplist->UDM_Data_length[UdmDataId]);\r
+                               }\r
 \r
                                hr = rs->MoveNext();\r
                        }\r
                hr = rs->Close();\r
+\r
+               if (opts.explore_flag)\r
+                       explore_udm_data(ppplist);\r
+\r
                }\r
 \r
        rs = NULL;\r
@@ -311,9 +366,8 @@ EXTERN_C struct pushpin_safelist * read_pushpins(char* ppin_file_name)
     }  \r
 \r
        if (opts.verbose_flag > 1)\r
-               printf("Read %d pushpins from %s.\n", ppinnum, ppin_file_name);\r
+               printf("Read %d pushpins from %s.\n", ppplist->num_pushpins, ppin_file_name);\r
 \r
-       ppplist->num_pushpins=ppinnum;\r
        return ppplist;\r
 }\r
 \r
@@ -355,9 +409,9 @@ EXTERN_C void write_pushpins_from_gpx(char* ppin_file_name,
                                          ADODB::adLockOptimistic, \r
                                          -1 );\r
 \r
-               variant2val(rs->Fields->GetItem("DbVersion")->Value,            VT_I2,  &DbVersion);\r
-               variant2val(rs->Fields->GetItem("LastSetId")->Value,            VT_I4,  &LastSetId);\r
-               variant2val(rs->Fields->GetItem("LastUserDataId")->Value,       VT_I4,  &LastUserDataId);\r
+               variant2val(rs->Fields->GetItem("DbVersion")->Value,            VT_I2,  &DbVersion, 0);\r
+               variant2val(rs->Fields->GetItem("LastSetId")->Value,            VT_I4,  &LastSetId, 0);\r
+               variant2val(rs->Fields->GetItem("LastUserDataId")->Value,       VT_I4,  &LastUserDataId, 0);\r
 \r
                printf("Got DbVersion=%d, LastSetId=%d and LastUserDataId=%d\n", DbVersion, LastSetId, LastUserDataId);\r
 \r
@@ -386,7 +440,7 @@ EXTERN_C void write_pushpins_from_gpx(char* ppin_file_name,
 \r
                if (opts.st_version_num<9)\r
                {\r
-                       sql = "Select UdId, SetId, Grid, Precision, MatchId, MOBBId, SourceUdId from UD_Main";\r
+                       sql = "Select UdId, SetId, Grid, Precision, RenderData, MatchId, MOBBId, SourceUdId from UD_Main";\r
                        sql2 = "Select UdId, NoteTypeId, GeocodeHierarchy, GeocodeContext, UdName, NoteShort, NoteLong from UD_Secondary";\r
                        hr = rs->Open(sql, \r
                                  cnstr, \r
@@ -402,7 +456,7 @@ EXTERN_C void write_pushpins_from_gpx(char* ppin_file_name,
                }\r
                else\r
                {\r
-                       sql = "Select UdId, SetId, Grid, Precision, MatchId, MOBBId, SourceUdId, NoteTypeId, GeocodeHierarchy, GeocodeContext, UdName, NoteShort, NoteLong from UD_Main";\r
+                       sql = "Select UdId, SetId, Grid, Precision, RenderData, MatchId, MOBBId, SourceUdId, NoteTypeId, GeocodeHierarchy, GeocodeContext, UdName, NoteShort, NoteLong from UD_Main";\r
                        // maybe we have to do this later, when rs is set?\r
                        hr = rs->Open(sql, \r
                                  cnstr, \r
@@ -445,6 +499,14 @@ EXTERN_C void write_pushpins_from_gpx(char* ppin_file_name,
                        rs->Fields->GetItem("Grid"              )->Value = val2variant(VT_I4,   &(gridpt.grid));\r
                        rs->Fields->GetItem("Precision" )->Value = val2variant(VT_I4,   &(gridpt.precision));\r
                        rs->Fields->GetItem("MatchId"   )->Value = val2variant(VT_I2,   &sitwo);\r
+                       // This is stored in the DB as binary type, \r
+                       // but hopefully it should be ok to write as int.\r
+                       // FIXME - Potential problem: \r
+                       // This field has longer maximum width in newer MAP versions.\r
+                       // Width 32 (AR2001), 64 (MP2002), 128 (AR2003)\r
+\r
+                       if(gpt->symbol != 0)\r
+                               rs->Fields->GetItem("RenderData"        )->Value = val2variant(VT_I4,   &(gpt->symbol));\r
                        rs->Fields->GetItem("MOBBId"    )->Value = val2variant(VT_I4,   &lzero);\r
                        rs->Fields->GetItem("SourceUdId")->Value = val2variant(VT_I4,   &lzero);\r
 \r
index c6e0ccf7d806e86c61ad0b62b321ad68a5f42aa9..a6ea04453cace859f1dd8497b14a3e0c613dd398 100644 (file)
@@ -55,7 +55,11 @@ char * gpx_elem_name[] =
        "trkpt",\r
        "name",\r
        "desc",\r
-       "src"\r
+       "src",\r
+       "sym",\r
+       "type",\r
+       "url",\r
+       "urlname"\r
 };\r
 \r
 struct gpxpt * gpxpt_new()\r
@@ -67,6 +71,9 @@ struct gpxpt * gpxpt_new()
        nw->lon=0;\r
        nw->elevation=0;\r
        nw->use_elevation=0;\r
+       nw->symbol=0;\r
+       nw->url=NULL;\r
+       nw->urlname=NULL;\r
        return nw;\r
 }\r
 \r
@@ -76,20 +83,23 @@ void gpxpt_delete(struct gpxpt * pt)
                return;\r
        free(pt->name);\r
        free(pt->desc);\r
+       free(pt->url);\r
+       free(pt->urlname);\r
        free(pt);\r
 }\r
 \r
 struct gpxpt * gpxpt_copy(struct gpxpt * otherpt)\r
 {\r
        struct gpxpt * nw = (struct gpxpt *)xmalloc(sizeof(struct gpxpt));\r
-       nw->name=xmalloc(strlen(otherpt->name)+1);\r
-       strcpy(nw->name, otherpt->name);\r
-       nw->desc=xmalloc(strlen(otherpt->desc)+1);\r
-       strcpy(nw->desc, otherpt->desc);\r
+       nw->name = _strdup(otherpt->name);\r
+       nw->desc = _strdup(otherpt->desc);\r
        nw->lat=otherpt->lat;\r
        nw->lon=otherpt->lon;\r
        nw->elevation=otherpt->elevation;\r
        nw->use_elevation=otherpt->use_elevation;\r
+       nw->symbol = otherpt->symbol;\r
+       nw->url = _strdup(otherpt->url);\r
+       nw->urlname = _strdup(otherpt->urlname);\r
        return nw;\r
 }\r
 \r
@@ -486,7 +496,6 @@ void enddesc(void *userData, const char *name)
        desc[cdata_length]=0;\r
        cdata=NULL;\r
        cdata_length=0;\r
-       str2ascii(desc);\r
        switch (current_main_element)\r
        {\r
        case GPX_ELEM_TYPE_WPT:\r
@@ -521,7 +530,169 @@ void endsrc(void *userData, const char *name)
 {\r
 }\r
 \r
-#define GPX_NUM_ELEM_HANDLERS 10\r
+void startsym(void *userData, const char *name, const char **atts)\r
+{\r
+}\r
+\r
+void endsym(void *userData, const char *name)\r
+{\r
+       struct gpx_data * dat = (struct gpx_data *)userData;\r
+       char* sym_str = xrealloc(cdata, cdata_length+1);\r
+       int sym_num=0;\r
+       int read;\r
+\r
+       sym_str[cdata_length]=0;\r
+       cdata=NULL;\r
+       cdata_length=0;\r
+\r
+\r
+       // We need to convert the name of the symbol sym_str from GPX \r
+       // into a numeric symbol number for MS Map.\r
+       // For now we just accept MS Map Symbol n\r
+\r
+/*     if (strncmp(sym_str, "MS Map Symbol", 13)!=0)\r
+       {\r
+               free(sym_str);\r
+               return;\r
+       }\r
+*/     \r
+       read=sscanf(sym_str, "MS Map Symbol %d", &sym_num);\r
+\r
+       if( (read==1) && (sym_num>0) )\r
+               printf("Translated symbol name %s as symbol number %d\n", sym_str, sym_num);\r
+       else\r
+       {\r
+               printf("Couldn't translate symbol name %s to a symbol number\n", sym_str);\r
+               free(sym_str);\r
+               return;\r
+       }\r
+\r
+       switch (current_main_element)\r
+       {\r
+       case GPX_ELEM_TYPE_WPT:\r
+               // We may have already set the symbol from <type>,\r
+               // which over-rides the symbol.\r
+               // Fixme this override should eb an option, not the default.\r
+               if(dat->wpt_list[dat->wpt_list_count-1]->symbol == 0)\r
+                       dat->wpt_list[dat->wpt_list_count-1]->symbol=sym_num;\r
+               break;\r
+       case GPX_ELEM_TYPE_RTE:\r
+       case GPX_ELEM_TYPE_RTEPT:\r
+       case GPX_ELEM_TYPE_TRK:\r
+       case GPX_ELEM_TYPE_TRKSEG:\r
+       case GPX_ELEM_TYPE_TRKPT:\r
+       default:\r
+               break;\r
+       }\r
+\r
+       free(sym_str);\r
+}\r
+\r
+void starttype(void *userData, const char *name, const char **atts)\r
+{\r
+}\r
+\r
+void endtype(void *userData, const char *name)\r
+{\r
+       struct gpx_data * dat = (struct gpx_data *)userData;\r
+       char* type_str = xrealloc(cdata, cdata_length+1);\r
+       int sym_num=0;\r
+\r
+       type_str[cdata_length]=0;\r
+       cdata=NULL;\r
+       cdata_length=0;\r
+\r
+       if(strcmp(type_str, "Geocache|Virtual Cache")==0)\r
+               sym_num=68; // balloon\r
+       else if(strcmp(type_str, "Geocache|Traditional Cache")==0)\r
+               sym_num=55; // small purple or green triange\r
+       else if(strcmp(type_str, "Geocache|Multi-Cache")==0)\r
+               sym_num=107; // three flags\r
+               //sym_num=132; // traffic-light\r
+       else if(strcmp(type_str, "Geocache|Unknown Cache")==0)\r
+               sym_num=254; // question-mark\r
+       else if(strcmp(type_str, "Geocache|Micro Cache")==0)\r
+               sym_num=65;\r
+       \r
+       switch (current_main_element)\r
+       {\r
+       case GPX_ELEM_TYPE_WPT:\r
+               if(sym_num != 0)\r
+                       dat->wpt_list[dat->wpt_list_count-1]->symbol=sym_num;\r
+               break;\r
+       case GPX_ELEM_TYPE_RTE:\r
+       case GPX_ELEM_TYPE_RTEPT:\r
+       case GPX_ELEM_TYPE_TRK:\r
+       case GPX_ELEM_TYPE_TRKSEG:\r
+       case GPX_ELEM_TYPE_TRKPT:\r
+       default:\r
+               break;\r
+       }\r
+\r
+       free(type_str);\r
+}\r
+\r
+void starturl(void *userData, const char *name, const char **atts)\r
+{\r
+}\r
+\r
+void endurl(void *userData, const char *name)\r
+{\r
+       struct gpx_data * dat = (struct gpx_data *)userData;\r
+       char* url_str = xrealloc(cdata, cdata_length+1);\r
+\r
+       url_str[cdata_length]=0;\r
+       cdata=NULL;\r
+       cdata_length=0;\r
+\r
+       switch (current_main_element)\r
+       {\r
+       case GPX_ELEM_TYPE_WPT:\r
+               dat->wpt_list[dat->wpt_list_count-1]->url=url_str;\r
+               break;\r
+       case GPX_ELEM_TYPE_RTE:\r
+       case GPX_ELEM_TYPE_RTEPT:\r
+       case GPX_ELEM_TYPE_TRK:\r
+       case GPX_ELEM_TYPE_TRKSEG:\r
+       case GPX_ELEM_TYPE_TRKPT:\r
+       default:\r
+               break;\r
+               free(url_str);\r
+       }\r
+\r
+}\r
+\r
+void starturlname(void *userData, const char *name, const char **atts)\r
+{\r
+}\r
+\r
+void endurlname(void *userData, const char *name)\r
+{\r
+       struct gpx_data * dat = (struct gpx_data *)userData;\r
+       char* url_str = xrealloc(cdata, cdata_length+1);\r
+\r
+       url_str[cdata_length]=0;\r
+       cdata=NULL;\r
+       cdata_length=0;\r
+\r
+       switch (current_main_element)\r
+       {\r
+       case GPX_ELEM_TYPE_WPT:\r
+               dat->wpt_list[dat->wpt_list_count-1]->urlname=url_str;\r
+               break;\r
+       case GPX_ELEM_TYPE_RTE:\r
+       case GPX_ELEM_TYPE_RTEPT:\r
+       case GPX_ELEM_TYPE_TRK:\r
+       case GPX_ELEM_TYPE_TRKSEG:\r
+       case GPX_ELEM_TYPE_TRKPT:\r
+       default:\r
+               break;\r
+               free(url_str);\r
+       }\r
+\r
+}\r
+\r
+#define GPX_NUM_ELEM_HANDLERS 14\r
 \r
 gpx_elm_start_handler gpx_start_elm_handler[] =\r
 {\r
@@ -534,7 +705,11 @@ gpx_elm_start_handler gpx_start_elm_handler[] =
        &starttrkpt,\r
        &startname,\r
        &startdesc,\r
-       &startsrc\r
+       &startsrc,\r
+       &startsym,\r
+       &starttype,\r
+       &starturl,\r
+       &starturlname\r
 };\r
 \r
 gpx_elm_end_handler gpx_end_elm_handler[] =\r
@@ -548,10 +723,13 @@ gpx_elm_end_handler gpx_end_elm_handler[] =
        &endtrkpt,\r
        &endname,\r
        &enddesc,\r
-       &endsrc\r
+       &endsrc,\r
+       &endsym,\r
+       &endtype,\r
+       &endurl,\r
+       &endurlname\r
 };\r
 \r
-\r
 int get_gpx_type_ndx(const char* type_name)\r
 {\r
        int i;\r
index 864980ed88b9cd8015bcdd4857e0e06bb078139e..0fc1d49d53b5a7b1bdd21091c99953c630c857f9 100644 (file)
@@ -92,8 +92,13 @@ void * xrealloc(void* ptr, size_t size)
 char * str2ascii(char* str)\r
 {\r
        int i;\r
-       int len=strlen(str);\r
+       int len;\r
        unsigned char * ustr = (unsigned char*)str;\r
+\r
+       if(str==NULL)\r
+               return str;\r
+\r
+       len=strlen(str);\r
        for(i=0; i<len; i++)\r
                // FIXME saxcount complains that 0x1c is an invalid character, what else??\r
                if ( (ustr[i]>127) || (ustr[i]==0x1c) )\r
@@ -107,11 +112,30 @@ char * str2ascii(char* str)
 char * strappend(char* str1, char* str2)\r
 // create a new string\r
 {\r
-       int len1=strlen(str1);\r
-       int len2=strlen(str2);\r
-       char* nw = (char*)xmalloc(len1 + len2 +1);\r
-       strcpy(nw, str1);\r
-       strcpy(nw+len1, str2);\r
+       int len1;\r
+       int len2;\r
+       char* nw;\r
+       \r
+       if (str1==NULL)\r
+               len1=0;\r
+       else\r
+               len1=strlen(str1);\r
+\r
+       if (str2==NULL)\r
+               len2=0;\r
+       else\r
+               len2=strlen(str2);\r
+\r
+       nw = (char*)xmalloc(len1 + len2 +1);\r
+\r
+       if (str1 != NULL)\r
+               strcpy(nw, str1);\r
+       if (str2 != NULL)\r
+               strcpy(nw+len1, str2);\r
+       \r
+       //just in case len1 + len2 =0\r
+       nw[len1 + len2]=0;\r
+\r
        return nw;\r
 }\r
 \r
index df25be3bc9e2d9d5b667e4f50fc7b7f6366ab29e..d47124a701a68840265329e97a71e4a0c9870bcd 100644 (file)
@@ -90,15 +90,6 @@ LINK32=link.exe
 # Begin Source File\r
 \r
 SOURCE=.\annotations.c\r
-\r
-!IF  "$(CFG)" == "st2gpx - Win32 Release"\r
-\r
-!ELSEIF  "$(CFG)" == "st2gpx - Win32 Debug"\r
-\r
-# SUBTRACT CPP /FA<none>\r
-\r
-!ENDIF \r
-\r
 # End Source File\r
 # Begin Source File\r
 \r
@@ -223,14 +214,6 @@ SOURCE=.\history.txt
 # End Source File\r
 # Begin Source File\r
 \r
-SOURCE=.\msado15.tlh\r
-# End Source File\r
-# Begin Source File\r
-\r
-SOURCE=.\msado15.tli\r
-# End Source File\r
-# Begin Source File\r
-\r
 SOURCE=.\ToDo.txt\r
 # End Source File\r
 # End Target\r
index 3738383de220eebedca67ced1c7e8a8bcecb3d6f..670e3e1a34f2caee4236fa95023738e044f6899f 100644 (file)
 extern "C" {
 #endif
 
-//#define MEMCHK
-//#define DEBUG_STDOUT
 
 #ifdef _DEBUG
+\r
+#define MEMCHK\r
+#define DEBUG_STDOUT\r
+\r
 #define _CRTDBG_MAP_ALLOC
 #define  SET_CRT_DEBUG_FIELD(a)   _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
 #define  CLEAR_CRT_DEBUG_FIELD(a) _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG))
@@ -98,7 +100,8 @@ extern struct contents;
 extern struct st2gpx_options opts;
 void * xmalloc(size_t size);
 void * xrealloc(void* ptr, size_t size);
-char * str2ascii(char* str);
+char * str2ascii(char* str);\r
+char * strappend(char* str1, char* str2);
 int readbytes(FILE* file, char* buf, int bytes2read);
 //nannol.c
 struct annotations * merge_gpx_annot(struct annotations * annots, struct gpx_data* all_gpx);
index b61d88aa693116d2d00b04c6c4f110fd62c801d1..b0bd690bfb5e3290aafdd8b43441a88398d25aa8 100644 (file)
@@ -86,9 +86,8 @@ void gpx_write_file_trailer(FILE* gpx_out_file)
        }\r
 }\r
 \r
-void gpx_write_point(FILE* gpx_out_file, struct gpxpt * pt, int pt_type, char* opt_elms)\r
-// FIXEM do <name> from pt, not from opt_elms\r
-// FIXME same for other atts defined in gpxpt\r
+void gpx_write_point(FILE* gpx_out_file, struct gpxpt * pt, int pt_type)\r
+// FIXME write other atts defined in gpxpt\r
 {\r
        if (gpx_out_file!=NULL)\r
        {\r
@@ -96,17 +95,28 @@ void gpx_write_point(FILE* gpx_out_file, struct gpxpt * pt, int pt_type, char* o
                        fprintf(gpx_out_file, "\t\t");\r
                else if (pt_type == GPX_RTEPT)\r
                        fprintf(gpx_out_file, "\t");\r
-               fprintf(gpx_out_file, "\t<%s lat=\"%f\" lon=\"%f\">%s</%s>\n",\r
-                               gpxptypelabel[pt_type], pt->lat, pt->lon,\r
-                               opt_elms, gpxptypelabel[pt_type]);\r
+               fprintf(gpx_out_file, "\t<%s lat=\"%f\" lon=\"%f\">", \r
+                               gpxptypelabel[pt_type], pt->lat, pt->lon);\r
+               if( (pt->name != NULL) && (strlen(pt->name)>0) )\r
+                       fprintf(gpx_out_file, "<name><![CDATA[%s]]></name>", pt->name);\r
+               if( (pt->desc != NULL) && (strlen(pt->desc)>0) )\r
+                       fprintf(gpx_out_file, "<desc><![CDATA[%s]]></desc>", pt->desc);\r
+               // FIXME do some translation here?\r
+               if(pt->symbol != 0)\r
+                       fprintf(gpx_out_file, "<sym>MS Map Symbol %d</sym>", pt->symbol);\r
+               if( (pt->url != NULL) && (strlen(pt->url)>0) )\r
+                       fprintf(gpx_out_file, "<desc><![CDATA[%s]]></desc>", pt->url);\r
+               if( (pt->urlname != NULL) && (strlen(pt->urlname)>0) )\r
+                       fprintf(gpx_out_file, "<desc><![CDATA[%s]]></desc>", pt->urlname);\r
+               fprintf(gpx_out_file, "</%s>\n", gpxptypelabel[pt_type]);\r
        }\r
 }\r
 \r
 void gpx_write_jour_point(FILE* gpx_out_file, struct journey * jour, struct jour_rtept * wpt)\r
 {\r
        struct gpxpt * pt = gpxpt_new();\r
-       char* opt_elms;\r
-       int optlen;\r
+//     char* opt_elms;\r
+//     int optlen;\r
        struct f_jour_pt_head * f_wpt_head;\r
 \r
        if (gpx_out_file==NULL)\r
@@ -118,28 +128,31 @@ void gpx_write_jour_point(FILE* gpx_out_file, struct journey * jour, struct jour
                f_wpt_head = (struct f_jour_pt_head *)(jour->buf + (wpt->pthead_os));\r
                pt->lat=scaled2deg(f_wpt_head->scaled_lat);\r
                pt->lon=scaled2deg(f_wpt_head->scaled_lon);\r
-               optlen = f_wpt_head->cbtext1 + 60;\r
-               opt_elms = (char*)xmalloc(optlen);\r
+//             optlen = f_wpt_head->cbtext1 + 60;\r
+//             opt_elms = (char*)xmalloc(optlen);\r
                //FIXME use str2ascii??\r
-               sprintf(opt_elms, "<name><![CDATA[%s]]></name>", wpt->text1);\r
+//             sprintf(opt_elms, "<name><![CDATA[%s]]></name>", wpt->text1);\r
+               pt->name=_strdup(wpt->text1);\r
 \r
        }\r
        else\r
        {\r
-               optlen = strlen(wpt->pushpin->UdName) + strlen(wpt->pushpin->NoteShort) + 60;\r
-               opt_elms = (char*)xmalloc(optlen);\r
+//             optlen = strlen(wpt->pushpin->UdName) + strlen(wpt->pushpin->NoteShort) + 60;\r
+//             opt_elms = (char*)xmalloc(optlen);\r
 \r
-               sprintf(opt_elms, "<name><![CDATA[%s]]></name><desc><![CDATA[%s]]></desc>",\r
-                               wpt->pushpin->UdName, wpt->pushpin->NoteShort);\r
+//             sprintf(opt_elms, "<name><![CDATA[%s]]></name><desc><![CDATA[%s]]></desc>",\r
+//                             wpt->pushpin->UdName, wpt->pushpin->NoteShort);\r
+               pt->name=_strdup(wpt->text1);\r
+               pt->desc=_strdup(wpt->pushpin->NoteShort);\r
 \r
                pt->lat = wpt->pushpin->lat;\r
                pt->lon = wpt->pushpin->lon;\r
        }\r
 \r
-       gpx_write_point(gpx_out_file, pt, GPX_RTEPT, opt_elms);\r
+       gpx_write_point(gpx_out_file, pt, GPX_RTEPT);\r
 \r
        gpxpt_delete(pt);\r
-       free(opt_elms);\r
+//     free(opt_elms);\r
 }\r
 \r
 void gpx_write_jour_header(FILE* gpx_out_file)\r
@@ -176,8 +189,8 @@ void gpx_write_pushpinlist (FILE* gpx_out_file, struct pushpin_safelist *ppplist
 {\r
        int i;\r
        struct gpxpt * pt=NULL;\r
-       char* opt_elms;\r
-       int optlen;\r
+//     char* opt_elms;\r
+//     int optlen;\r
 \r
        if ((gpx_out_file==NULL) || (ppplist==NULL))\r
                return;\r
@@ -191,28 +204,37 @@ void gpx_write_pushpinlist (FILE* gpx_out_file, struct pushpin_safelist *ppplist
                if (ppplist->pushpin_list[i]==NULL)\r
                        break;\r
 \r
-               optlen = strlen(ppplist->pushpin_list[i]->UdName)\r
-                               + strlen(ppplist->pushpin_list[i]->NoteShort) + 60;\r
-               opt_elms = (char*)xmalloc(optlen);\r
+//             optlen = strlen(ppplist->pushpin_list[i]->UdName)\r
+//                             + strlen(ppplist->pushpin_list[i]->NoteShort) + 60;\r
+//             opt_elms = (char*)xmalloc(optlen);\r
 \r
-               sprintf(opt_elms, "<name><![CDATA[%s]]></name><desc><![CDATA[%s]]></desc>",\r
-                               ppplist->pushpin_list[i]->UdName, ppplist->pushpin_list[i]->NoteShort);\r
+//             sprintf(opt_elms, "<name><![CDATA[%s]]></name><desc><![CDATA[%s]]></desc>",\r
+//                             ppplist->pushpin_list[i]->UdName, ppplist->pushpin_list[i]->NoteShort);\r
+\r
+               pt->name = _strdup(ppplist->pushpin_list[i]->UdName);\r
+               pt->desc = _strdup(ppplist->pushpin_list[i]->NoteShort);\r
 \r
                pt->lat = ppplist->pushpin_list[i]->lat;\r
                pt->lon = ppplist->pushpin_list[i]->lon;\r
-\r
-               gpx_write_point(gpx_out_file, pt, GPX_WPT, opt_elms);\r
-               free(opt_elms);\r
+               // FIXEM some translation is needed here\r
+               pt->symbol = ppplist->pushpin_list[i]->RenderData;\r
+\r
+               gpx_write_point(gpx_out_file, pt, GPX_WPT);\r
+//             free(opt_elms);\r
+               free(pt->name);\r
+               pt->name=NULL;\r
+               free(pt->desc);\r
+               pt->desc=NULL;\r
        }\r
        fprintf(gpx_out_file, "\n");\r
        gpxpt_delete(pt);\r
 }\r
 \r
-void gpx_write_annot_rec(FILE* gpx_out_file, const struct annot_rec * rec)\r
+void gpx_write_annot_rec(FILE* gpx_out_file, struct annot_rec * rec)\r
 {\r
        int pt_type;\r
        int p;\r
-       char opt_elms[200];\r
+//     char opt_elms[200];\r
        struct gpxpt * pt;\r
 \r
        if ( (gpx_out_file==NULL) || (rec==NULL) )\r
@@ -257,6 +279,7 @@ void gpx_write_annot_rec(FILE* gpx_out_file, const struct annot_rec * rec)
                for (p=0; p < rec->line_points; p++)\r
                {\r
                        pt=gpx_get_point(rec->buf + rec->line_offset + 12*p);\r
+                       pt->name=(char*)xmalloc(7);\r
                        if(pt==NULL)\r
                        {\r
                                printf("got null pt #%p in annotation %d, skipping more points in this annotation\n",\r
@@ -264,12 +287,14 @@ void gpx_write_annot_rec(FILE* gpx_out_file, const struct annot_rec * rec)
                                break;\r
                        }\r
                        if(opts.use_gpx_route)\r
-                               sprintf(opt_elms, "<name>rp%04d</name>", p);\r
+                               sprintf(pt->name, "rp%04d", p);\r
+                               //sprintf(opt_elms, "<name>rp%04d</name>", p);\r
                        else\r
                                // we need to include a name for trackpoints\r
                                // for them to be recognised by easygps.\r
-                               sprintf(opt_elms, "<name>tp%04d</name>", p);\r
-                       gpx_write_point(gpx_out_file, pt, pt_type, opt_elms);\r
+                               sprintf(pt->name, "tp%04d", p);\r
+                               //sprintf(opt_elms, "<name>tp%04d</name>", p);\r
+                       gpx_write_point(gpx_out_file, pt, pt_type);\r
                        gpxpt_delete(pt);\r
                }\r
 \r